
package Seguridad;

import java.awt.Frame;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;


public class Funciones {

    KeyPairGenerator generadorLlaves;
    KeyPair parLlave;
    Cipher cifrarMensaje;
    byte[] textoFinal;

    public Funciones() 
        {
            generadorLlaves = null;
            parLlave = null;
            cifrarMensaje = null;
            textoFinal = null;
        }

    public String formatoClave(Key key) 
        {
            StringBuffer sb = new StringBuffer();
            String algo = key.getAlgorithm();
            String fmt = key.getFormat();
            byte[] encoded = key.getEncoded();
            sb.append("Key[algorithm=" + algo + ", format=" + fmt + ", bytes=" + encoded.length + "]\n");
        //if (fmt.equalsIgnoreCase("RAW")){
        //sb.append("Key Material (in hex):: ");
        //sb.append(Util.byteArray2Hex(key.getEncoded()));
        //}

            return sb.toString();
        }

    public KeyPair generarLlave() 
        {
        
            try {
                generadorLlaves = KeyPairGenerator.getInstance("RSA");
                } 
            
            catch (NoSuchAlgorithmException ex) 
                {
                    Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
                }

                generadorLlaves.initialize(1024);
                parLlave = generadorLlaves.generateKeyPair();

                return parLlave;
        }

    public void inicializarCifrado() throws NoSuchAlgorithmException 
        {
        
            try {
            cifrarMensaje = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // Instancia del que encripta datos
            } 
                catch (NoSuchPaddingException ex)
                    {
                        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
                    }
    }

    
    /**
     * Este es la info respecto a la funcion cifrarDescifrar(). es un Metodo
     * para cifrar o descifrar algun mensaje
     *
     * @param modo es el modo que recibe, toma valores enteros y se refiere si
     * quiere cifrar o descifrar
     * @param tipoLlave necesario para aplicar el cifrado
     * @pa
     * @see
     */
    public byte[] cifrarDescifrar(int modo, Key tipoLlave, byte[] texto) throws NoSuchAlgorithmException, IllegalBlockSizeException {

        inicializarCifrado();

        try {
            cifrarMensaje.init(modo, tipoLlave);
        } 
        
        catch (InvalidKeyException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            textoFinal = cifrarMensaje.doFinal(texto); //inicio de cifrado
        } 
        
        catch (BadPaddingException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        }

        return textoFinal;
    }

    public String [] enviarKeyString(KeyPair llavesGeneradas) 
        {
            String[] v = new String[2];
            v[0] = llavesGeneradas.getPrivate().toString();
            v[1] = llavesGeneradas.getPublic().toString();

            return v;
        }
}
